home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1994 July / PSL Monthly Shareware CD-ROM (Public Software Library) (July 1994).iso / reviews / fgrep.doc < prev    next >
Text File  |  1989-09-20  |  26KB  |  646 lines

  1.                                   FGREP 1.71
  2.                                   ----------
  3.  
  4.         "|" denotes changes in the recent versions.
  5.  
  6.  
  7.         Purpose
  8.         -------
  9.         FGREP (Fast GREP) is a small utility that can be used to find
  10.         strings of characters in ASCII text files, and arbitrary
  11.         sequences of bytes in other files.  String search capabilities
  12.         are not extensive (no regular expressions), but FGREP is small
  13.         and very, very fast.  FGREP is intended to replace DOS's FIND
  14.         filter with something faster and more flexible.
  15.  
  16.         UNIX people: we fully realize that this isn't the grep or fgrep
  17.         with which you are familiar.  We know that the RE in GREP means
  18.         "regular expressions" and we know that we don't support regular
  19.         expressions.  However, the name serves to point people in the
  20.         right direction.  Please don't write to tell us that this "isn't
  21.         really grep".
  22.  
  23.  
  24.         Syntax
  25.         ------
  26.         FGREP's syntax is
  27.  
  28.       |         FGREP [-abBceflmMopsvwx01] target {@file}
  29.  
  30.         Looks complicated, lots of switches, but the most common use is
  31.         very simple:
  32.  
  33.                 FGREP hello myfile.txt
  34.  
  35.         This command would display all lines of MYFILE.TXT that contain
  36.         the string "hello".
  37.  
  38.  
  39.         Targets
  40.         -------
  41.         The target is what you're looking for in the file.  There are
  42.         two ways to specify targets: as strings and as series of
  43.         hexadecimal bytes.  The two can be combined in a single target
  44.         specification.
  45.  
  46.         Strings are sequences of ASCII characters, like "hello".
  47.         Normally, you can just type in the string and forget it, but you
  48.         may have to "delimit" the string, i.e., bracket it by a pair of
  49.         matching non-alphanumeric characters (anything except - and $):
  50.  
  51.             'string'
  52.             /string/
  53.             .string.
  54.  
  55.         Choose a delimiter that does not appear in the string.  This is
  56.         no good:
  57.  
  58.             'you've made a mistake'
  59.  
  60.         Delimiters are required for a string target if any of these four
  61.         conditions are met:
  62.  
  63.             -- it is combined with hex byte sequences (more below)
  64.             -- it contains spaces or tabs
  65.             -- it begins with a non-alphanumeric character
  66.             -- it contains the DOS redirection characters < > |.
  67.  
  68.         In the last case, the string MUST be delimited by double quotes
  69.         ("), otherwise DOS will interpret it as redirection.
  70.  
  71.         Examples of valid string targets:
  72.  
  73.                 mov
  74.                 ax
  75.                 "two words"     (requires delimiter: contains a space)
  76.                 '/7'            (begins with non-alphanumeric)
  77.                 "f->x"          (contains ">", must use double quotes)
  78.  
  79.         It is always OK to delimit a string, even if delimiters are
  80.         unnecessary.
  81.  
  82.         REMEMBER that if the target contains DOS redirection characters
  83.         (<, >, or |), it MUST be delimited with double quotes ("") or
  84.         DOS will try to perform unwanted redirection.  For example:
  85.  
  86.             FGREP "a <= b" myfile.pas
  87.  
  88.         Hex byte sequences are used for binary file searching when the
  89.         bytes to be searched for are non-displayable characters or make
  90.         no sense as strings (e.g., program code).  They are specified as
  91.         pairs of hexadecimal bytes introduced by a leading '$':
  92.  
  93.             $EF
  94.             $CD21           (CDh, 21h)
  95.             $CD$21          (identical; either format is OK)
  96.             $00FFFE00       (00h, FFh, FEh, 00h)
  97.             $CD 21          (ILLEGAL: no spaces permitted)
  98.  
  99.         You can combine strings and hex sequences by using a '+':
  100.  
  101.             "abc"+$E74A+"def"
  102.  
  103.  
  104.         Target wildcards
  105.         ----------------
  106.         String targets (not hex targets) may contain one or mmore "?"
  107.         wildcards.  The ? will match any single non-null character in
  108.         the file.  E.g., "[?i]" will match "[si]", "[di]", etc., but not
  109.         "[i]".  Wildcards are not permitted when hex byte sequences are
  110.         used.
  111.  
  112.         If you want to search for the '?' character literally, use
  113.         '\?'.  For example, the target
  114.  
  115.                 what\?
  116.  
  117.         will search for the literal string "what?".
  118.  
  119.  
  120.         Specifying target files
  121.         -----------------------
  122.         You can list zero (see "Redirection"), one, or multiple files to
  123.         be searched.  Files listed may include DOS's * and ? wildcards.
  124.         Paths may be specified.  Examples:
  125.  
  126.             myfile.txt
  127.             *.txt
  128.             *.*
  129.             this.c that.c other.c
  130.             *.c *.pas
  131.             C:\UTIL\*.* D:\SYS\*.*
  132.             E:\LIBRARY\*.D?C
  133.  
  134.  
  135.       | File lists
  136.       | ----------
  137.       | If the name of a file on the command line is prefixed with an
  138.       | '@' character (e.g., '@list.txt'), the file is assumed to be a
  139.       | text file containing the names of files to be searched.  For
  140.       | example:
  141.       |
  142.       |     fgrep hello @files.lst
  143.       |
  144.       | FGREP will assume that the file FILES.LST is a text file that
  145.       | contains the names of files to be searched.  Each line of such a
  146.       | file should contain the name(s) of one or more files to be
  147.       | searched.  Files in file lists are specified exactly as are
  148.       | files named on the command line, except that you can't use
  149.       | another '@' file list; that is, file lists can't be nested.
  150.       |
  151.       | Here is an example of a valid list file:
  152.       |
  153.       |     this.c
  154.       |     c:\c\*.c d:\c\*.c
  155.       |     d:\misc\*.txt
  156.       |
  157.       | The name specified for the list file cannot contain wildcards;
  158.       | that is, this is illegal:
  159.       |
  160.       |     fgrep hello @lists.*        (WRONG)
  161.       |
  162.       | If you want to search for text in a file whose name begins with
  163.       | an '@', use a double '@'.  For example,
  164.       |
  165.       |     fgrep hello @@foo.txt
  166.       |
  167.       | will search for 'hello' in the file @FOO.TXT.
  168.  
  169.  
  170.         Redirection
  171.         -----------
  172.         If no file is listed, FGREP will take its input from the
  173.         standard input device, permitting redirection.  For example:
  174.  
  175.             DIR | fgrep pas
  176.  
  177.         would display any lines from a directory listing that contain
  178.         the string "pas".  Or,
  179.  
  180.             DIR | fgrep "<dir>"
  181.  
  182.         would list all subdirectories of the current directory.
  183.  
  184.         This command:
  185.  
  186.             arc p somefile foo.txt | FGREP somestring
  187.  
  188.         would display all lines from the file FOO.TXT in the archive
  189.         file SOMEFILE that contain "somestring".
  190.  
  191.         FGREP will terminate with an error if no file is listed and
  192.         standard input is not redirected.  Otherwise, it would be
  193.         waiting for keyboard input to scan, possibly leading you to
  194.         believe that it had hung up.
  195.  
  196.  
  197.         Examples of use
  198.         ---------------
  199.         Here are some examples of FGREP use:
  200.  
  201.         1. List all lines of MYFILE.TXT containing "hello"
  202.  
  203.             FGREP hello myfile.txt
  204.  
  205.         2. List all lines of all *.C files in the current directory that
  206.         contain "include foo.c":
  207.  
  208.             FGREP "include foo.c"  *.c
  209.  
  210.         3. List all lines from FILEA.EXT, FILEB.EXT, and FILEC.EXT that
  211.         contain the string "abcd" followed by any character:
  212.  
  213.             FGREP abcd? filea.ext fileb.ext filec.ext
  214.  
  215.         4. Display occurrences of the byte CDh followed by 21h (a DOS
  216.         call) in the program MYPROG.EXE:
  217.  
  218.             FGREP $CD21 myprog.exe
  219.  
  220.         5. Display occurrences of the string "abc" followed by a byte of
  221.         zeroes in all files in the C:\UTIL and D:\SYS:
  222.  
  223.             FGREP 'abc' + $00 c:\util\*.* d:\sys\*.*
  224.  
  225.  
  226.         Output
  227.         ------
  228.         FGREP's default screen output looks like this:
  229.  
  230.                 **File <filename>
  231.                 [text of lines containing string]
  232.                 **File <filename>
  233.                 [text of lines containing string]
  234.  
  235.         If the "Microsoft" switch (-m or -M, see below) is used, the
  236.         output is in this format:
  237.  
  238.                 FILE.EXT(linenum): text
  239.  
  240.         This format is the standard format used by Microsoft (R)
  241.         language products and by its MEGREP.  If -m is used, only the
  242.         filename is displayed; if -M is used, the path will be included
  243.         if one was specified on the command line.
  244.  
  245.         When a hex byte sequence or the -b switch is specified, FGREP
  246.         uses the binary output mode.  See below for details.
  247.  
  248.         All useful output is sent to the standard output device, so it
  249.         may be piped to other programs or redirected to file:
  250.  
  251.                 FGREP target filea | yourprog
  252.                 FGREP target filea > test.txt
  253.  
  254.         Error messages and the program logo will appear always appear on
  255.         the console device, and will never appear in redirected or piped
  256.         output.
  257.  
  258.         FGREP returns an errorlevel to the operating system.  It will be
  259.         one of:
  260.  
  261.             0:   String not found in any file
  262.             1:   String found in at least one file
  263.             255: Error (file read error or bad parameter)
  264.  
  265.  
  266.         Switches
  267.         --------
  268.         These are the option switches that control how FGREP works.  All
  269.         switches are case-insensitive except -m/M and -b/B; for example,
  270.         either -a or -A will set ANSI mode.  All switches must precede
  271.         the target on the command line, but they may be in any order.
  272.         If you specify conflicting switches, the last one will be
  273.         effective.
  274.  
  275.         -a is ANSI mode.  If you have ANSI.SYS (or equivalent)
  276.            installed, escape characters (ASCII 27) in displayed text
  277.            lines can cause odd results.  If you use the -A switch,
  278.            FGREP will substitute an upside-down question mark (¿) for
  279.            ESC, possibly resulting in cleaner displays.  You'll only
  280.            need this switch if you have ANSI installed and there are ESC
  281.            characters in the files you're scanning.  Ignored in binary
  282.            mode.
  283.  
  284.         -b specifies binary search mode/output.  This switch is
  285.            automatically set if you use a hex byte sequence in the
  286.            target.  See "binary search" below.
  287.  
  288.         -B specifies a case insensitive binary search.
  289.  
  290.         -c makes the search case sensitive ("String" will not match
  291.            "string" or "STRING").  Normally, FGREP ignores case.  This
  292.            switch is ignored in binary mode.
  293.  
  294.         -e specifies that ONLY an errorlevel is to be returned.
  295.            There will be no display at all.  This is equivalent to the
  296.            combination -s0.
  297.  
  298.         -f causes the "**File" header lines to be displayed only for
  299.            those files that contain the search string.
  300.  
  301.         -l adds line numbers to FGREP's output.  Ignored in binary mode.
  302.  
  303.         -m or -M specify Microsoft (R) output format.  See "Output"
  304.            above.  If -m is used, only the filename will appear.  If
  305.            -M is used, the path will be included if one was specified on
  306.            the command line.  Ignored in binary mode.
  307.  
  308.         -o specifies a maximum output width.  It should be followed by a
  309.            decimal number from 1 to 255.  For example, -o40 causes FGREP
  310.            to truncate all output to a maximum of 40 characters per
  311.            line.  Do not confuse the "O" (Output) switch with the "0"
  312.            (zero text) switch.  Ignored in binary mode.
  313.  
  314.         -p pauses on full screen of output.
  315.  
  316.         -s suppresses the "**File" header lines in the output.
  317.  
  318.         -v provides a reVerse or negative search.  That is, all lines
  319.            that do NOT contain the specified string are displayed.  This
  320.            provides a handy way to get rid of lines containing specified
  321.            text.  Suppose, for example, that you have a file containing
  322.            a list of file names, and you are interested in all files
  323.            EXCEPT those that contain a '$' in the name (perhaps they are
  324.            temporary files):
  325.  
  326.                 FGREP -v "$" filename
  327.  
  328.            This switch is ignored in binary mode.
  329.  
  330.         -w indicates that white space (blanks and tabs) is not
  331.            significant.  White space in both the search string and the
  332.            input file will be ignored.  If -w is specified, the wildcard
  333.            character (?) will match any nonblank character.  Ignored in
  334.            binary mode.
  335.  
  336.         -x Do not display the logo/copyright.
  337.  
  338.         -0 ("0" text lines) suppresses the display of lines of text
  339.            containing the specified string.  FGREP will skip immediately
  340.            to the next file when the string is found.  Do not confuse
  341.            this with the "O" (Output width) switch.
  342.  
  343.         -1 ("1" text line) specifies that only the first line containing
  344.            containing the specified string in each file will be
  345.            displayed.  FGREP will then skip immediately to the next
  346.            file.
  347.  
  348.  
  349.         Binary search
  350.         -------------
  351.         If you use a hex byte sequence in your target, or if you specify
  352.         the -b or -B switch, FGREP uses a "binary" mode rather than the
  353.         usual text mode.  In this mode, FGREP is not concerned with
  354.         "lines" of text and can be used to search any file for arbitrary
  355.         sequences of strings.
  356.  
  357.         The output format is different.  Because there are no "lines" to
  358.         display, FGREP shows the locations in the file where the target
  359.         was found and the sixteen bytes surrounding the find (eight
  360.         before, and eight after).  Here is the output format, split into
  361.         two lines:
  362.  
  363.             nnnnnnnn: n n n n n n n n . n n n n n n n n
  364.                       cccccccc . cccccccc
  365.  
  366.         The initial sequence is the 32-bit file offset where the target
  367.         was found, in hex.  For example,
  368.  
  369.             0001C47A:
  370.  
  371.         indicates that the target was found at file offset 1C47A.
  372.  
  373.         The next two series (n n n ...) represent the eight bytes before
  374.         and after the target (which, logically, occurred at the '.'
  375.         position):
  376.  
  377.             4B 7F 37 42 42 44 FF FF . 20 20 21 48 48 4F 3C 22
  378.  
  379.         The final series (ccc...) represents the same sixteen bytes
  380.         displayed as characters.  Nondisplayable characters are shown as
  381.         periods.
  382.  
  383.         Unlike text searches, binary searches are normally case
  384.         sensitive.  That is, $41 ('A') will not match $61 ('a').  If you
  385.         want a binary search to be case INsensitive ($41 matches both
  386.         $41 and $61), use -B instead of -b.  The normal case sensitive
  387.         switch (-c) is ignored.
  388.  
  389.         These switches are also ignored in binary mode:
  390.  
  391.             -l          (show line numbers)
  392.             -w          (whitespace insensitive)
  393.             -v          (inverse search)
  394.             -m/M        (Microsoft format)
  395.  
  396.         Also, wildcards are not permitted in string targets when a
  397.         binary search is used.
  398.  
  399.  
  400.         "Fast" search algorithm
  401.         -----------------------
  402.         FGREP uses two different search techniques.  Both are fast, but
  403.         one is faster than the other.  The "slow" search will be used
  404.         if any of these conditions are met:
  405.  
  406.             - line numbers or Microsoft (R) format used (-L or -m/M)
  407.             - the search is reVerse (-V)
  408.             - the search is whitespace insensitive (-W)
  409.             - the target string contains wildcards ("?")
  410.  
  411.         For other searches, the "fast" technique is typically 20-40%
  412.         faster than the "slow", although we've seen 70% improvements in
  413.         some cases.  One tester reported that FGREP located a string in
  414.         the last line of a 440K file in 0.97 seconds (IBM AT).
  415.  
  416.         The technique has its roots in searching for unusual (less
  417.         frequently used) characters, so it will make more of a
  418.         difference searching for "squeeze" (q is a little-used letter)
  419.         than it will searching for "eat".
  420.  
  421.  
  422.         Notes
  423.         -----
  424.         1. The -f and -s switches are mutually exclusive.  If both are
  425.         specified, the last one will be effective.
  426.  
  427.         2. The -M/m and -s switches are also mutually exclusive.
  428.  
  429.         3. If you specify the -e switch, FGREP will stop processing as
  430.         soon as a nonzero errorlevel is determined.  The -e switch is
  431.         really designed to enable other programs to determine whether or
  432.         not a specific file contains a specific string in as little time
  433.         as possible.  For example, here's an algorithm that will quickly
  434.         'touch' all files that do NOT contain a specified string:
  435.  
  436.                 for file in (*.*) do
  437.                     FGREP -e string file
  438.                     if errorlevel < 1 then touch file
  439.                 end
  440.  
  441.         4. The -s switch is automatically set when input is taken from
  442.         standard input.
  443.  
  444.         5. FGREP optimizes the combination -s0 (suppress headers, no
  445.         text) to a -e.
  446.  
  447.         6. If you just want to know which files contain a string, use -0;
  448.         it saves time because the rest of the file (after the first hit)
  449.         is skipped.  The combination -0f is particularly efficient
  450.         for this as it will simply display a list of files that contain
  451.         the string.
  452.  
  453.         7. If any of the -V, -W, -L, or -M switches are used, or if the
  454.         target contains wildcards, input lines are limited to a maximum
  455.         length of 500 characters (if you use a -w search, spaces don't
  456.         count).  FGREP expects standard text files; binary files will
  457.         yield weird results unless you use the -b/B binary switch.  Word
  458.         processor files may or may not work, depending on how they are
  459.         formatted.  Lines can be terminated by any of CR, LF, or CR+LF.
  460.  
  461.         8. If output is redirected to disk, make sure there is enough
  462.         space available.  The program does not check.
  463.  
  464.  
  465.         A little note from the author
  466.         -----------------------------
  467.         I get lots of calls like this:
  468.  
  469.             I love FGREP because it's so fast.  It outperforms the next
  470.             faster text search utility I have by two-to-one.  If you
  471.             could just add (regular expressions | boolean searches), it
  472.             would be ideal.
  473.  
  474.         Well, one of the reasons why FGREP is so fast is because it
  475.         doesn't have to do lots of complex searching.  Because the
  476.         search is simple, I've been able to highly optimize the search
  477.         algorithms.  If I added regular expressions or boolean searches,
  478.         the main thing that distinguishes FGREP (its speed) from
  479.         other text search programs would go away.
  480.  
  481.         So.  I'm always glad to get comments and suggestions on FGREP,
  482.         so please keep calling and writing.  But I won't be adding
  483.         regular expressions or boolean searches.  If you need those,
  484.         there are plenty of fancier search programs available (including
  485.         the real grep).  The penalty for greater flexibility is usually
  486.         less speed.
  487.  
  488.  
  489.         Version 1.71
  490.         ------------
  491.         Adds file lists.
  492.         Adds file sharing support.
  493.         Corrects two bugs in binary mode display: displaying data beyond
  494.             end of file, and skipping bytes immediately after the
  495.             target.
  496.  
  497.         Version 1.70
  498.         ------------
  499.         Adds binary search.
  500.         Adds target concatenation (target+target).
  501.         Cancels if no file specified and not redirected.
  502.  
  503.         Version 1.64
  504.         ------------
  505.         Bug fix release only: fix garbage in -M display from 1.63
  506.  
  507.         Version 1.63
  508.         ------------
  509.         Distinguish between -M (path) and -m (no path) switches.
  510.         -M/-m and -S now mutually exclusive.
  511.         Allow search for literal '?' character via '\?'.
  512.  
  513.         Version 1.62
  514.         ------------
  515.         Added -M switch.
  516.         Increased max length of lines ("slow" search) from 256 to 500.
  517.  
  518.         Version 1.61
  519.         ------------
  520.         Fixed a problem with pausing on > 255 hits (-P not specified).
  521.  
  522.         Version 1.60
  523.         ------------
  524.         Added -P switch.
  525.         Fixed a problem with tab characters and -O switch.
  526.  
  527.         Version 1.59
  528.         ------------
  529.         Added -O switch.
  530.         Altered -L operations to allow for line numbers > 65535.  Line
  531.         numbers now right justified in a 6-character field.
  532.  
  533.         Version 1.58
  534.         ------------
  535.         Fixed two problems that were causing endless loops in 1.55-1.57.
  536.         Added -A switch.
  537.  
  538.         Version 1.57
  539.         ------------
  540.         Added -X switch.
  541.  
  542.         Versions 1.55/1.56
  543.         -----------------
  544.         "Fast" search algorithm added (thanks to Dave Angel for the
  545.             idea and the shove).
  546.         Fixed problems with redirected input.
  547.         Forced -v (reVerse) search to show blank lines.
  548.  
  549.         Versions 1.50/1.51
  550.         ------------------
  551.         These versions contain no new features but are significantly
  552.         faster than earlier versions.  Standard (case-insensitive)
  553.         searches run about 40% faster than 1.45 (which was 25-30%
  554.         faster than 1.40).  "Literal" searches (case-sensitive and
  555.         spacing-sensitive) are highly optimized and may be as much as
  556.         70% faster than 1.45.
  557.  
  558.         Version 1.45
  559.         ------------
  560.         We found a few areas that could be made more efficient.  This
  561.         version can be as much as 25-30% faster than version 1.40.
  562.  
  563.         The -L (line numbers) option was added, and improvements made to
  564.         parameter parsing such that delimiters are not always necessary.
  565.  
  566.  
  567.         Copyright/License/Warranty
  568.         --------------------------
  569.         This document and the program file FGREP.COM ("the software")
  570.         are copyrighted by the author.  The copyright owner hereby
  571.         licenses you to: use the software; make as many copies of the
  572.         program and documentation as you wish; give such copies to
  573.         anyone; and distribute the software and documentation via
  574.         electronic means.  There is no charge for any of the above.
  575.  
  576.         However, you are specifically prohibited from charging, or
  577.         requesting donations, for any such copies, however made; and
  578.         from distributing the software and/or documentation with
  579.         commercial products without prior permission.  An exception is
  580.         granted to not-for-profit user's groups, which are authorized to
  581.         charge a small fee (not to exceed $7) for materials, handling,
  582.         postage, and general overhead.  NO FOR-PROFIT ORGANIZATION IS
  583.         AUTHORIZED TO CHARGE ANY AMOUNT FOR DISTRIBUTION OF COPIES OF
  584.         THE SOFTWARE OR DOCUMENTATION, OR TO INCLUDE COPIES OF THE
  585.         SOFTWARE OR DOCUMENTATION WITH SALES OF THEIR OWN PRODUCTS.
  586.  
  587.         THIS INCLUDES A SPECIFIC PROHIBITION AGAINST FOR-PROFIT
  588.         ORGANIZATIONS DISTRIBUTING THE SOFTWARE, EITHER ALONE OR WITH
  589.         OTHER SOFTWARE, AND CHARGING A "HANDLING" OR "MATERIALS" FEE OR
  590.         ANY OTHER SUCH FEE FOR THE DISTRIBUTION.  NO FOR-PROFIT
  591.         ORGANIZATION IS AUTHORIZED TO INCLUDE THE SOFTWARE ON ANY MEDIA
  592.         FOR WHICH MONEY IS CHARGED.  PERIOD.
  593.  
  594.         No copy of the software may be distributed or given away without
  595.         this document; and this notice must not be removed.
  596.  
  597.         There is no warranty of any kind, and the copyright owner is not
  598.         liable for damages of any kind.  By using this free software,
  599.         you agree to this.
  600.  
  601.         The software and documentation are:
  602.  
  603.                            Copyright (C) 1985-1989 by
  604.                              Christopher J. Dunford
  605.                             The Cove Software Group
  606.                                  P.O. Box 1072
  607.                             Columbia, Maryland 21044
  608.  
  609.                                  (301) 992-9371
  610.                          CompuServe 76703,2002 [IBMNET]
  611.  
  612.          ----------------end-of-author's-documentation---------------
  613.  
  614.                         Software Library Information:
  615.  
  616.                    This disk copy provided as a service of
  617.  
  618.                         The Public (Software) Library
  619.  
  620.          We are not the authors of this program, nor are we associated
  621.          with the author in any way other than as a distributor of the
  622.          program in accordance with the author's terms of distribution.
  623.  
  624.          Please direct shareware payments and specific questions about
  625.          this program to the author of the program, whose name appears
  626.          elsewhere in  this documentation. If you have trouble getting
  627.          in touch with the author,  we will do whatever we can to help
  628.          you with your questions. All programs have been tested and do
  629.          run.  To report problems,  please use the form that is in the
  630.          file PROBLEM.DOC on many of our disks or in other written for-
  631.          mat with screen printouts, if possible.  The P(s)L cannot de-
  632.          bug programs over the telephone.
  633.  
  634.          Disks in the P(s)L are updated monthly, so if you did not get
  635.          this disk  directly from the P(s)L,  you should be aware that
  636.          the files in this set may no  longer be the current versions.
  637.  
  638.          For a copy of the latest monthly software library newsletter
  639.          and a list of the 2,000+ disks in the library, call or write
  640.  
  641.                         The Public (Software) Library
  642.                               P.O.Box 35705 - F
  643.                            Houston, TX 77235-5705
  644.                                (713) 665-7017
  645.  
  646.